package com.nowcoder.topic.dp.middle;

import java.util.Arrays;

/**
 * NC155 最长严格上升子数组(一)
 * @author d3y1
 */
public class NC155{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int maxSubArrayLengthTwo(int[] nums){
        return solution(nums);
    }

    /**
     * 动态规划
     *
     * dp[i]表示以第i个元素为结尾(nums[i]必选)的子数组的最长严格上升长度
     *
     * dp[i] = dp[i-1]+1  , (nums[i] > nums[i-1])
     *
     * @param nums
     * @return
     */
    private int solution(int[] nums){
        int len = nums.length;
        if(len <= 2){
            return len;
        }

        // 初始化
        int[] dp = new int[len];
        Arrays.fill(dp, Integer.valueOf(1));

        int result = 1;
        for(int i=1; i<len; i++){
            if(nums[i] > nums[i-1]){
                dp[i] = dp[i-1]+1;
                result = Math.max(result, dp[i]);
            }
        }

        // 合并
        for(int index=1; index<len; index++){
            if(dp[index] == 1){
                if(nums[index-1] < 100000){
                    result = Math.max(result, dp[index-1]+1);
                }
                continue;
            }
            int pre = index-dp[index];
            if(pre>=0 && nums[pre+1]>1){
                result = Math.max(result, dp[index]+1);
            }
            if(pre>=0 && nums[pre+2]-nums[pre]>=2){
                result = Math.max(result, dp[index]+dp[pre]);
            }
            if(pre-1>=0 && nums[pre+1]-nums[pre-1]>=2){
                result = Math.max(result, dp[index]+dp[pre]);
            }
        }

        return result;
    }
}